using System.Collections.Generic;

namespace Test.ConsoleProgram.Algorithm.Solution
{
    [TestDescription("算法: 0830. 较大分组的位置")]
    public class No0830_LargeGroupPositions : AbsBaseTestItem
    {
        /*
        在一个由小写字母构成的字符串 s 中，包含由一些连续的相同字符所构成的分组。
        例如，在字符串 s = "abbxxxxzyy" 中，就含有 "a", "bb", "xxxx", "z" 和 "yy" 这样的一些分组。
        分组可以用区间 [start, end] 表示，其中 start 和 end 分别表示该分组的起始和终止位置的下标。
        上例中的 "xxxx" 分组用区间表示为 [3,6] 。
        我们称所有包含大于或等于三个连续字符的分组为 较大分组 。
        找到每一个 较大分组 的区间，按起始位置下标递增顺序排序后，返回结果。

        示例 1：
            输入：s = "abbxxxxzzy"
            输出：[[3,6]]
            解释："xxxx" 是一个起始于 3 且终止于 6 的较大分组。
        示例 2：
            输入：s = "abc"
            输出：[]
            解释："a","b" 和 "c" 均不是符合要求的较大分组。
        示例 3：
            输入：s = "abcdddeeeeaabbbcd"
            输出：[[3,5],[6,9],[12,14]]
            解释：较大分组为 "ddd", "eeee" 和 "bbb"
        示例 4：
            输入：s = "aba"
            输出：[]
        提示：
            1 <= s.length <= 1000
            s 仅含小写英文字母
        */

        public override void OnTest()
        {
            Assert.TestExe(LargeGroupPositions, "aaa",
                new List<IList<int>>
                {
                    new int[] {0,2},
                });
            Assert.TestExe(LargeGroupPositions, "abbxxxxzzy",
                new List<IList<int>> {
                    new int[] {3,6},
                });
            Assert.TestExe(LargeGroupPositions, "abc",
                new List<IList<int>> { });
            Assert.TestExe(LargeGroupPositions, "abcdddeeeeaabbbcd",
                new List<IList<int>> {
                    new int[] {3,5},
                    new int[] {6,9},
                    new int[] {12,14},
                });
            Assert.TestExe(LargeGroupPositions, "aba",
                new List<IList<int>> { });
        }

        public IList<IList<int>> LargeGroupPositions(string s)
        {
            var list = new List<IList<int>>();
            int start = 0, end = 0, n = s.Length;
            char symbol = s[0];
            for (int i = 1; i < n; i++)
            {
                char item = s[i];
                if (item == symbol)
                    if (i == n - 1)
                        i++;
                    else
                        continue;
                end = i - 1;
                if (i - start >= 3)
                    list.Add(new int[] { start, end });
                start = i;
                symbol = item;
            }
            return list;
        }
    }
}
